|
PHP5의 추가된 사항을 올리는 곳입니다. |
[1] |
|
등록일:2007-10-10 23:09:26 (0%) 작성자: 제목:[문법] PHP코딩팁. include와 return의 특성 |
|
include 된 파일에서 return 을 해서 다음과 같이 값을 받을 수 있다.
test.php
<?php
$ret = include 'test2.php';
echo $ret;
?>
test2.php
<?php
return 'val';
?>
main 함수(PHP_SELF)에서 return 을 사용하면 exit의 효과가 된다.
또한 return 이후의 구문에서 정의된 함수라도 사용할 수 있다.
<?php
test1();
return; // 실행은 여기서 종료된다.
function test1(){
echo '11111';
}
?>
이번에는 이 특성을 함수가 겹치지 않게 정의하는 용도로 사용해보자. 함수가 겹치지 않으려면 다음과 같은 방법이 있다.
첫번째로는 if 문을 이용한다.
<?php
...
if (function_exists('~~~')) {
// 함수정의부
}
...
?>
두번째 방법은 return을 이용하는 것인데 보통 함수파일들을 include해서 사용하는 것을 생각해보면 나름대로 쓸만하다.
test.php
<?php
include 'test2.php';
test1();
function test1() {
echo '1111';
}
?>
test2.php
<?php
if (function_exists('test1')) return false;
function test1() {
echo '2222';
}
?>
이 경우에는 test2.php 의 test1()이 아예 무시된다. 그런데 재미있는 것은 이 경우라도 겹치지 않는 함수에 대해서는 실행이 가능하다는 것이다. 게다가 if 구문 없이 무작정 return 을 해줘도 가능하다!!
test.php
<?php
include 'test2.php';
test1();
test2();
function test1() {
echo '1111';
}
?>
test2.php
<?php
return;
function test1() {
echo '2222';
}
function test2() {
echo '어라? 이건 되네?';
}
?>
저는 주로 함수를 끝머리에서 정의하는데, 이런 식으로 사용한다면 겹치지 않게 정의를 할 수 있을 것 같습니다. 마지막으로 하나더. 그럼 다른 겹치는 함수가 겹치지 않는 함수 다음에 나온다면?
test.php
<?php
include 'test2.php';
test1();
test2();
test3();
function test1() {
echo '1111';
}
function test3() {
echo '내가 먼저 했음';
}
?>
test2.php
<?php
return;
function test1() {
echo '2222';
}
function test2() {
echo '어라? 이건 되네?';
}
function test3() {
echo '얜 또 안돼네..';
}
?>
"내가 먼저 했음" 이 나옵니다.
거친마루 05-05-29 19:59
허허 의도적인 특징인지 우연히 생긴 특징인지 모르지만 유용하네요 -_- 버전이 올라가면서 스펙이 바뀌는게 아니라면 당장적용을..
혹시 return의 이유에 대해 가독성이 떨어질찌 모르니 인클루드 될 파일에는
<?php /* if function not exists */ return;
정도로 써주는 센스를 발휘해도 괜찮을꺼같습니다. : )
허허 의도적인 특징인지 우연히 생긴 특징인지 모르지만 유용하네요 -_- 버전이 올라가면서 스펙이 바뀌는게 아니라면 당장적용을..
혹시 return의 이유에 대해 가독성이 떨어질찌 모르니 인클루드 될 파일에는
<?php /* if function not exists */ return;
정도로 써주는 센스를 발휘해도 괜찮을꺼같습니다. : )
낭망백수 05-05-30 01:25
이건좀... 음... 진정한 팁으로 승화시키려면 레퍼런스가 필요할 듯 싶은데... 함수정의에 대해서는 전문가의 고견이 좀 필요할 듯 싶습니다. 꾸벅~!
이건좀... 음... 진정한 팁으로 승화시키려면 레퍼런스가 필요할 듯 싶은데... 함수정의에 대해서는 전문가의 고견이 좀 필요할 듯 싶습니다. 꾸벅~!
이대규 05-05-30 10:05
return 문에 대한 것은 명세에 있긴 한데요..
중복되는 함수명에 대한 처리는 명확하게 안나와있습니다.
아주 유용하긴 할거 같은데.. 좀 불안하군여..
제 생각에 아마 PHP6 쯤 되면 namespace 개념이 도입되지 않을까 생각하는 중입니다.
return 문에 대한 것은 명세에 있긴 한데요..
중복되는 함수명에 대한 처리는 명확하게 안나와있습니다.
아주 유용하긴 할거 같은데.. 좀 불안하군여..
제 생각에 아마 PHP6 쯤 되면 namespace 개념이 도입되지 않을까 생각하는 중입니다.
낭망백수 05-05-30 11:41
이대규 // 그런데 namespace 개념이 동적 웹페이지에서 어떤 역할을 할 수 있을지 의문입니다. 함수 정의와 관련된 부분은 뭐 정적(ㅡㅡ;) 인 컴파일 언어에서도 마찬가지 아닌가 하는 생각도 들구요. 꾸벅~!
이대규 // 그런데 namespace 개념이 동적 웹페이지에서 어떤 역할을 할 수 있을지 의문입니다. 함수 정의와 관련된 부분은 뭐 정적(ㅡㅡ;) 인 컴파일 언어에서도 마찬가지 아닌가 하는 생각도 들구요. 꾸벅~!
이대규 05-05-30 11:57
제 생각에 namespace는 현대적 프로그래밍 언어가 갖추어야 할 기본 교양이 아닐까 합니다.
하나의 프로그램이 여러 업체들이 만든 코드가 한데 어울려서 만들어지는 것이 아주 일반적인 상황이니까요.
php에선 some_ 식의 함수/클래스이름으로 해결하고 있는데 좀 구시대적이기도 하고 불편할 때도 많고 해서요..
제 생각에 namespace는 현대적 프로그래밍 언어가 갖추어야 할 기본 교양이 아닐까 합니다.
하나의 프로그램이 여러 업체들이 만든 코드가 한데 어울려서 만들어지는 것이 아주 일반적인 상황이니까요.
php에선 some_ 식의 함수/클래스이름으로 해결하고 있는데 좀 구시대적이기도 하고 불편할 때도 많고 해서요..
캐빈 05-05-30 12:21
[캐빈] - 위의 예제중 두번째 방식에 대한 반론
== 글쓴이의 본문 중 ========================
test.php
<?php
include \'test2.php\';
test1();
function test1() {
echo \'1111\';
}
?>
test2.php
<?php
if (function_exists(\'test1\')) return false;
function test1() {
echo \'2222\';
}
?>
========================================
라고 하셨는데
이 경우는 Fatal 오류가 발생하지 않나요? (TEST - Linux : Apache_1.3.33 : PHP-5.0.3)
PHP 의 실행 구조상 include 의 return 은 해당 파일의 \'실행\'을 종료하는 것이며 이는 다시 말해 return 다음의 function, class 도
메모리에 적재를 하겠다는 말입니다.
먼저 main 함수가 되는 test.php 의 코드를 읽어 드려 class, function 등을 메모리에 적재 할 것이며
그 다음 include 가 된 test2.php 의 class, function 등을 읽어 들이는데
이때 위와 같은 코드에서는 test2.php 의 test1() 함수 선언부에서
이미 정의 된 함수(test1.php 를 먼저 읽어 들였으므로) 라고 Fatal 오류가 날 것입니다.
이를 방지 하기 위해서
test2.php 는
<?PHP
if (!function_exists(\'test1\')) {
function test1() {
echo \'2222\';
}
}
?>
와 같이 행복한고니님이 말씀하신 첫번째 방식으로 RunTime 함수 정의로 처리하여야 옳은 방법이 될것 같습니다.
[캐빈] - 위의 예제중 두번째 방식에 대한 반론
== 글쓴이의 본문 중 ========================
test.php
<?php
include \'test2.php\';
test1();
function test1() {
echo \'1111\';
}
?>
test2.php
<?php
if (function_exists(\'test1\')) return false;
function test1() {
echo \'2222\';
}
?>
========================================
라고 하셨는데
이 경우는 Fatal 오류가 발생하지 않나요? (TEST - Linux : Apache_1.3.33 : PHP-5.0.3)
PHP 의 실행 구조상 include 의 return 은 해당 파일의 \'실행\'을 종료하는 것이며 이는 다시 말해 return 다음의 function, class 도
메모리에 적재를 하겠다는 말입니다.
먼저 main 함수가 되는 test.php 의 코드를 읽어 드려 class, function 등을 메모리에 적재 할 것이며
그 다음 include 가 된 test2.php 의 class, function 등을 읽어 들이는데
이때 위와 같은 코드에서는 test2.php 의 test1() 함수 선언부에서
이미 정의 된 함수(test1.php 를 먼저 읽어 들였으므로) 라고 Fatal 오류가 날 것입니다.
이를 방지 하기 위해서
test2.php 는
<?PHP
if (!function_exists(\'test1\')) {
function test1() {
echo \'2222\';
}
}
?>
와 같이 행복한고니님이 말씀하신 첫번째 방식으로 RunTime 함수 정의로 처리하여야 옳은 방법이 될것 같습니다.
낭망백수 05-05-30 13:49
캐빈 //
!function_exists() 조건下에서 정의하도록 하는 것이 메뉴얼에서도 제시하는 방법이라고 압니다만....
일단, PHP4.3.11 에서는 error가 발생하지 않으며,
(PHP5 의 core가 상당히 변했다고 하더군요. 클래스 및 객체는 완전히 새로 작성되었다고 하구요.)
test.php
<?php
include \'test2.php\';
test1();
function test1() {
echo \'1111\';
}
?>
test2.php
<?php
if (function_exists(\'test1\')) return false;
function test1() {
echo \'2222\';
}
?>
// RESULT : \"1111\"
결과는 제가 예상한 것과 딴판입니다.
제 예상은, include 문이 파싱 제어와 관련되었으므로 먼저 test2.php 를 파싱하고
\'2222\'를 출력하는 test1()이 먼저 정의되므로
test.php 에서 중복정의 parse error 를 유발한다고 생각했었습니다.
추측건데,
파싱과 실행시점이란게 있기는 있는데,
파싱시점엔 단순히 문자열 토큰을 얻는데 그치고 루틴을 실제로 메모리로 로딩하는 것은 아닌것 같습니다.
어쨋든
if !function_exists()
define function(){};
표현이 올바르다고 생각합니다.
꾸벅~!
캐빈 //
!function_exists() 조건下에서 정의하도록 하는 것이 메뉴얼에서도 제시하는 방법이라고 압니다만....
일단, PHP4.3.11 에서는 error가 발생하지 않으며,
(PHP5 의 core가 상당히 변했다고 하더군요. 클래스 및 객체는 완전히 새로 작성되었다고 하구요.)
test.php
<?php
include \'test2.php\';
test1();
function test1() {
echo \'1111\';
}
?>
test2.php
<?php
if (function_exists(\'test1\')) return false;
function test1() {
echo \'2222\';
}
?>
// RESULT : \"1111\"
결과는 제가 예상한 것과 딴판입니다.
제 예상은, include 문이 파싱 제어와 관련되었으므로 먼저 test2.php 를 파싱하고
\'2222\'를 출력하는 test1()이 먼저 정의되므로
test.php 에서 중복정의 parse error 를 유발한다고 생각했었습니다.
추측건데,
파싱과 실행시점이란게 있기는 있는데,
파싱시점엔 단순히 문자열 토큰을 얻는데 그치고 루틴을 실제로 메모리로 로딩하는 것은 아닌것 같습니다.
어쨋든
if !function_exists()
define function(){};
표현이 올바르다고 생각합니다.
꾸벅~!
낭망백수 05-05-30 13:55
본문의 마지막 테스트결과는...
1111어라? 이건 되네?내가 먼저 했음
입니다.
코드만 보아서는 어떤 함수가 실제로 정의되는지 모르므로
마지막 방법은 옳지 않은 방법이라고 생각됩니다.
꾸벅~!
본문의 마지막 테스트결과는...
1111어라? 이건 되네?내가 먼저 했음
입니다.
코드만 보아서는 어떤 함수가 실제로 정의되는지 모르므로
마지막 방법은 옳지 않은 방법이라고 생각됩니다.
꾸벅~!
Gloridea 05-05-30 15:09
PHP 5.0.3 환경에서는 확실히 에러입니다. : )
테스트 환경 : Fedora Core2 / Apache 2.0.51 / PHP 5.0.3
PHP 5.0.3 환경에서는 확실히 에러입니다. : )
테스트 환경 : Fedora Core2 / Apache 2.0.51 / PHP 5.0.3
낭망백수 05-05-30 15:35
PHP5 가 보다 strict 하다는 거군요. ^^;
PHP5 가 보다 strict 하다는 거군요. ^^;
핑크플로이드 05-05-30 20:05
일단 코드부분을 메모리에 적재하고...
지역변수는 스택영역에 저장한 다음...
실행하면서 return value 값에 대한 스택영역값을 채우고...
include를 하게 되면 부함수 호출처럼 원래 호출 부분을 벗어나 include 된 파일을 파싱하겠지만...
include 된 파일의 function exist 이후 코드는 파싱하지 않는군요...
일단 코드부분을 메모리에 적재하고...
지역변수는 스택영역에 저장한 다음...
실행하면서 return value 값에 대한 스택영역값을 채우고...
include를 하게 되면 부함수 호출처럼 원래 호출 부분을 벗어나 include 된 파일을 파싱하겠지만...
include 된 파일의 function exist 이후 코드는 파싱하지 않는군요...
낭망백수 05-05-31 01:56
실행시 include를 만나는 시점에서 include된 파일을 파싱한다... 라...
include.. 파싱제어가 아니라 결국 함수라는 것이군요. 꾸벅~!
출처 : http://www.phpschool.com/gnuboard4/bbs/board.php?bo_table=tipntech&wr_id=40195&sca=&sfl=wr_subject%7C%7Cwr_content&stx=php5&sop=and&page=5 |
[본문링크] [문법] PHP코딩팁. include와 return의 특성
|
[1]
|
|
|
|
|
코멘트(이글의 트랙백 주소:/cafe/tb_receive.php?no=1086 |
|
|
|
|
|
|
|
|
|
Copyright byCopyright ⓒ2005, SSISO Community All Rights Reserved.
|
|
|